#include <string.h>
#include "Protocol.h"

const char* GomokuProtocol::SERVER_IP = "192.168.1.112";

// 协议基类
/**
 * 构造方法。
 * @param type      类型
 * @param username  用户名
 */
GomokuProtocol::GomokuProtocol(Type type, const char* username) :
    mType(type) {
    strcpy_s(mUsername, USERNAME_BUF_LEN, username);
}

/**
 * 析构方法。
 */
GomokuProtocol::~GomokuProtocol() {
}

// 寻找用户请求
/**
 * 构造方法。
 * @param username  用户名
 */
FindUsersRequest::FindUsersRequest(const char* username) :
    GomokuProtocol(GomokuProtocol::FIND_USERS, username) {
}

// 寻找用户结果
/**
 * 构造方法。
 */
FindUsersResult::FindUsersResult() :
    GomokuProtocol(GomokuProtocol::FIND_USERS, "") {
    memset(mUsernameList, 0, sizeof(mUsernameList));
}

// 游戏结束
/**
 * 构造方法。
 * @param reason    结束原因
 * @param rivalName 对手的名字
 */
GameOver::GameOver(GameOverReason reason, const char* rivalName) :
    GomokuProtocol(GomokuProtocol::GAME_OVER, rivalName),
    mReason(reason) {
}

// 挑战请求
/**
 * 构造方法。
 * @param rivalName 对手的名字
 * @param username  用户名
 */
InviteRequest::InviteRequest(const char* rivalName, const char* username) :
    GomokuProtocol(GomokuProtocol::INVITE_REQUEST, username) {
    strcpy_s(mRivalName, USERNAME_BUF_LEN, rivalName);
}

// 挑战结果
/**
 * 构造方法。
 * @param accept    接受挑战则为 true，否则为 false
 * @param rivalName 对手的名字
 * @param username  用户名
 */
InviteResult::InviteResult(bool accept, const char* rivalName, const char* username) :
    GomokuProtocol(GomokuProtocol::INVITE_RESULT, username),
    mAccept(accept) {
    strcpy_s(mRivalName, USERNAME_BUF_LEN, rivalName);
}

// 登录请求
/**
 * 构造方法。
 * @param username  用户名
 */
LogonRequest::LogonRequest(const char* username) :
    GomokuProtocol(GomokuProtocol::LOGON, username) {
}

// 登录结果
/**
 * 构造方法。
 * @param username  用户名
 */
LogonResult::LogonResult(const char* username) :
    GomokuProtocol(GomokuProtocol::LOGON, username) {
}

// 放置棋子
/**
 * 构造方法。
 * @param rivalName 对手的名字
 * @param x, y      棋子位置（窗口坐标）
 */
PutPiece::PutPiece(const char* rivalName, int x, int y) :
    GomokuProtocol(GomokuProtocol::PUT_PIECE, rivalName),
    mX(x), mY(y) {
}

// 退出游戏
/**
 * 构造方法。
 * @param username  用户名
 */
QuitGame::QuitGame(const char* username) :
    GomokuProtocol(GomokuProtocol::QUIT_GAME, username) {
}
